package com.idanchuang.component.logback.metric;

import com.alibaba.fastjson.JSON;
import com.idanchuang.component.core.ServiceInfo;
import com.idanchuang.component.logback.helper.LogContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 指标日志打印工具类
 *
 * @author yjy
 * @date 2020/8/27 15:41
 **/
public class MetricLogger {

    /**
     * 打印指标日志
     * @param name  指标名称
     * @param value 指标值
     */
    public static void log(String name, double value) {
        log(name, value, null);
    }

    /**
     * 打印指标日志
     * @param name  指标名称
     * @param value 指标值
     * @param metaInfo 附加属性
     */
    public static void log(String name, double value, Map<String, Object> metaInfo) {
        log(name, value, metaInfo, false);
    }

    /**
     * 打印指标日志
     * @param name  指标名称
     * @param value 指标值
     * @param metaInfo 附加属性
     * @param coverByMeta 如果metaInfo中存在重复key, 是否覆盖
     */
    public static void log(String name, double value, Map<String, Object> metaInfo, boolean coverByMeta) {
        Map<String, Object> info = new HashMap<>();
        // 指标名
        info.put("name", name);
        // 应用
        info.put("appId", ServiceInfo.getAppId());
        // 指标时间
        long timestamp = System.currentTimeMillis();
        info.put("timestamp", timestamp);
        info.put("time", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(timestamp)));
        // 指标值
        info.put("value", value);
        if (metaInfo != null) {
            if (coverByMeta) {
                info.putAll(metaInfo);
            } else {
                metaInfo.forEach(info::putIfAbsent);
            }
        }
        AsyncMetricLogger.info(JSON.toJSONString(info));
    }

}
